package demoserver;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author thien
 */
public class Connector implements Runnable {
    private DataInputStream dataInputStream;
    private DataOutputStream dataOutputStream;
    Socket socket;
    Server server;
    private long delay = 250;
    int idClient;
    private Thread thread;
       

    
    Queue queue;
    int imgIndex;
    int iconIndex;

    
    
    String[] imgName;
    String[] iconName;
    
    String text = "\\ 0023.png 0 01.png Các cậu xem, đây là chiếc móng của khủng long bạo chúa. " +
                "\\ 0023.png 0 01.png Cái móng này có tuổi hàng triệu năm rồi." +
                "\\ 0023.png 0 01.png Bố tớ được người ta tặng khi còn ở bên Mĩ." +
                "\\ 0012.png 3 01.png Đâu đâu cho tớ xem với nào." +
                "\\ 0010.png 0 02.png Thật khó tin, cái móng này có tuổi cả triệu năm rồi ư?" +
                "\\ 0012.png 3 02.png Xong chưa Chaien, cho tớ xem với." +
                "\\ 0008.png 0 02.png Tới lượt cậu này Xuka." +
                "\\ 0018.png 0 02.png Thật là tuyệt vời, nhìn chiếc móng này và tưởng tượng..."
            + "\\ 0019.png 0 02.png Cảm giác như thời kỳ khủng long đang ở trước mắt mình vậy!" +
                "\\ 0012.png 3 02.png Nào, nào tới lượt tớ chứ." +
                "\\ 0022.png 0 02.png Thôi, để tớ cất đi vậy. Dốt như Nôbita có xem cũng không hiểu đâu. " +
                "\\ 0013.png 3 02.png Có mỗi cái móng bé tẹo mà cũng bày đặt làm phách." +
                "\\ 0013.png 3 02.png Cứ chờ đấy tớ sẽ đào hẳn một con khủng long cơ." +
                "\\ 0022.png 0 02.png Này làm được thì hãy nói nhé!" +
                "\\ 0014.png 3 02.png Các cậu cứ đợi mà xem." +
                "\\ 0021.png 0 02.png Không làm được thì bọn tớ sẽ bắt cậu ăn mì bằng lỗ mũi đấy!" +
                "\\ 0000.png 0 00.png ...Nôbita chạy đến ngọn núi sau trường học..." +
                "\\ 0011.png 0 03.png Trong sách có nói đa số hóa thạch nằm ở địa tầng viễn cổ..." +
                "\\ 0011.png 0 03.png Mà địa tầng viễn cổ thường lộ ra ở sườn dốc và vách núi." +
                "\\ 0013.png 0 03.png Theo trực giác của mình thì nó phải ở đây, mà sao mãi không thấy nhỉ?" +
                "\\ 0000.png 0 00.png Này xuống đây ngay!" +
                "\\ 0011.png 0 00.png Ối, ối, cháu xuống ngay ạ." +
                "\\ 0000.png 0 04.png Bác cứ thắc mắc từ sáng, tại sao lại có đá rơi xuống nền nhà?" +
                "\\ 0011.png 0 04.png Dạ cháu xin lỗi bác, cháu cũng đang thấy chán,cháu đi ngay đây ạ." +
                "\\ 0000.png 0 04.png Không phải cháu cứ đi là được đâu, bây giờ bác phạt cháu đào cho bác cái hố chôn rác." +
                "\\ 0011.png 0 04.png Ơ , cháu sẽ đào ngay ạ."+
                "\\ 0013.png 0 05.png Ôi chán quá, mình đến để đào khủng long cơ mà." +
                "\\ 0014.png 0 05.png Ai ngờ bây giờ lại phải đào hố chôn rác. Biết vậy mình ở nhà cho nó khỏe." +
                "\\ 0000.png 0 05.png ...Cạch..." +
                "\\ 0011.png 0 05.png Ơ cái gì đây? " +
                "\\ 0011.png 0 05.png ... " +
                "\\ 0012.png 0 06.png Trời ơi một quả trứng khủng long hóa thạch."+
                "\\ 0000.png 0 00.png ..." +
                "\\ 0000.png 0 00.png ... ..." +
                "\\ 0011.png 0 07.png Đôrêmon cậu xem này, đây đúng là trứng khủng long rồi." +
                "\\ 0011.png 0 07.png Tớ sẽ ấp cho nó nở ra." +
                "\\ 0014.png 0 07.png Lúc đó Xêkô sẽ biết tay tớ." +
                "\\ 0000.png 0 00.png 2 tuần sau ..." +
                "\\ 0001.png 0 08.png Nôbita ,chúng ta không thể để Pisu ở đây mãi được đâu." +
                "\\ 0001.png 0 08.png Phải đưa Pisu về thời đại của nó thôi." +
                "\\ 0004.png 0 08.png Ở đây sớm muộn gì nó cũng gặp nguy hiểm." +
                "\\ 0011.png 0 08.png Cậu nói đúng, nhưng tớ muốn Pisu lớn thêm 1 chút nữa.";
   
    
    String username = "sunnet";
    
    String book1 = "001 Đô rê mon; Tập 1: Chú khủng long của Nôbita; Hoàn thành; Ngày 12/2/2011; FUJIKO.F.Fujio; Vui nhộn, phiêu lưu.";
    String book2 = "001 Bảy viên ngọc rồng 2; Tập 11: Đại hội võ thuật; Hoàn thành; Ngày 12/2/2011; Akira TORIYAMA; Vui nhộn, võ thuật, phiêu lưu.";
    String book3 = "001 Bảy viên ngọc rồng 3; Tập 12: Đại hội võ thuật; Hoàn thành; Ngày 12/2/2011; Akira TORIYAMA; Vui nhộn, võ thuật, phiêu lưu.";
    String book4 = "001 Bảy viên ngọc rồng 4; Tập 13: Đại hội võ thuật; Hoàn thành; Ngày 12/2/2011; Akira TORIYAMA; Vui nhộn, võ thuật, phiêu lưu.";
    String toAddress;
    String subj;
    String content;
    String[] bookStore;
    private int endSystem = 0;
    public Connector(Socket socket,Server server)  throws IOException{
        this.socket = socket;
        this.server = server;
        dataInputStream = new DataInputStream(socket.getInputStream());
        dataOutputStream = new DataOutputStream(socket.getOutputStream());
        queue = new Queue(dataOutputStream);
       
        /*
        
        imgName = new String[8];
        for(int i=0;i<imgName.length;i++){
            imgName[i] = "/Image/0"+(i+1)+".png";
        }
        
        iconName = new String[13];
        iconName[0] = "/Image/cha/0008.png";
        iconName[1] = "/Image/cha/0010.png";
        iconName[2] = "/Image/cha/0011.png";
        iconName[3] = "/Image/cha/0012.png";
        iconName[4] = "/Image/cha/0013.png";
        iconName[5] = "/Image/cha/0014.png";
        iconName[6] = "/Image/cha/0018.png";
        iconName[7] = "/Image/cha/0019.png";
        iconName[8] = "/Image/cha/0021.png";
        iconName[9] = "/Image/cha/0022.png";
        iconName[10] = "/Image/cha/0023.png";
        iconName[11] = "/Image/cha/0001.png";
        iconName[12] = "/Image/cha/0004.png";
        imgIndex = 0;
        bookStore = new String[22];
        for(int i=0;i<bookStore.length;i++){
            if(i<5){                      
                bookStore[i] = book1;
            }
            else if(i<10){        
                bookStore[i] = book2;
            }
            else if(i<15){     
                bookStore[i] = book3;
            }
            else{                
                bookStore[i] = book4;
            }
        }
        */
//        String currentDir  = new java.io.File(".").toURI().toString();
//        String pathToClass = Connector.class.getResource( "Connector.class" ).toString();
//        System.out.println( pathToClass.substring( currentDir.length() - 2  ));
               
//        System.out.println(this.getClass().getResource("/Image").getPath());
        start();
    }

    
    private void start(){
        thread = new Thread(this);
        thread.start();
    }

    public void run() {

        Thread currentThread = Thread.currentThread();
        while(currentThread == thread){
            long startTime = System.currentTimeMillis();
            try {
              //  System.out.println("dang xu ly yeu cau");
                getRequest();
            } catch (IOException ex) {
                try {
                                      
                    System.out.println("error socket close");
                    socket.close();
                } catch (IOException ex1) {
                    Logger.getLogger(Connector.class.getName()).log(Level.SEVERE, null, ex1);
                }
                Logger.getLogger(Connector.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            Runtime.getRuntime().gc();
            
            long timeTake = System.currentTimeMillis() - startTime;
            if(timeTake < delay){
                synchronized(this){
                    try {
                        wait(delay - timeTake);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
            else {
                    Thread.yield();
            }
        }
    }
    
    private void getRequest() throws IOException{
        if(dataInputStream.available()>0){
            int request = dataInputStream.readInt();
             System.out.println("doc request"+request);
            if(request==Server.REQUEST_END_SYSTEM){
                if(endSystem==0){
                    endSystem++;
                    sender(Server.END_LIST.getBytes("UTF-8"),request,Server.TEXT);
                    System.out.println("ready to close");
                }
                else{
                    thread = null;
                    dataInputStream.close();
                    queue.close();       
                    socket.close();  
                    System.out.println("Socket close");
                }
                return;
            }
            else if(request==Server.SEND_ADDRESS){
                this.toAddress = dataInputStream.readUTF();
                System.out.println("to:"+toAddress);
                //userSender(user,request);
            }
            else if(request==Server.SEND_SUBJ){
                this.subj = dataInputStream.readUTF();
                 System.out.println("subj:"+toAddress);
              //  userSender(user,request);
            }
            else if(request==Server.SEND_CONTENT){
                this.content = dataInputStream.readUTF();
                //userSender(user,request);
            }
             else if(request==Server.SEND_ACTION){

                  sendMail();
                  System.out.println("da sent xong");
                //userSender(user,request);
            }
            /*
            else if(request==Server.REQUEST_LIST){
                int index = dataInputStream.readInt();
                for(int i=index;i<Math.min(index+5, bookStore.length);i++){
                    sender(bookStore[i].getBytes("UTF-8"),request,Server.TEXT);
                }   
                if(index+5>=bookStore.length){
                    sender(Server.END_LIST.getBytes("UTF-8"),request, Server.TEXT);
                }
            }
            else if(request==Server.REQUEST_MANGA){
                int time = dataInputStream.readInt();
                if(time==0){
                    System.out.println("send manga");
                    sender(text.getBytes("UTF-8"),request, Server.TEXT );                 
                    sender(String.valueOf(iconName.length).getBytes("UTF-8"), request,Server.NOTE);
                    sender(String.valueOf(imgName.length).getBytes("UTF-8"), request,Server.NOTE);
                    while(iconIndex<iconName.length){ 
                        System.out.println("send icon");
                        InputStream is = null;    
                        is = InputStream.class.getResourceAsStream(iconName[iconIndex]);
                        byte[] temp = new byte[is.available()];
                        is.read(temp);
                        String str = iconName[iconIndex].substring(11,iconName[iconIndex].length());
                        sender(temp, request, Server.ICON,str,iconIndex);
                        iconIndex++;
                    }          
                    while(imgIndex<Math.min(2,imgName.length)){    

                        InputStream is = null;    
                                             
                        is = InputStream.class.getResourceAsStream(imgName[imgIndex]);

                        byte[] temp = new byte[is.available()];
                        is.read(temp);
                                                            
                        String str = imgName[imgIndex].substring(7,imgName[imgIndex].length());

                        sender(temp, request,Server.IMAGE,str, imgIndex);

                        imgIndex++;
                    }    
                }
                else{              
                    int index = imgIndex;
                   while(imgIndex<Math.min(index+2,imgName.length)){       
                        InputStream is = null;            
                        is = InputStream.class.getResourceAsStream(imgName[imgIndex]);
                        byte[] temp = new byte[is.available()];
                        is.read(temp);
                        String str = imgName[imgIndex].substring(7,imgName[imgIndex].length());
                        sender(temp,request,Server.IMAGE,str,imgIndex );
                        imgIndex++;
                    }     
                }

            }
            else if(request==Server.REQUEST_END_READ){   
                imgIndex = 0;
                iconIndex = 0;
                sender(Server.END_LIST.getBytes("UTF-8"), request,Server.TEXT);
            }
            else if(request==Server.REQUEST_END_LIST){   
                sender(Server.END_LIST.getBytes("UTF-8"),request, Server.TEXT);
            }
                   
            else if(request==Server.REQUEST_ERROR_ICON){   
                int index = dataInputStream.readInt();                   
                InputStream is = null;                      
                is = InputStream.class.getResourceAsStream(iconName[index]);   
                byte[] temp = new byte[is.available()];  
                is.read(temp);                                    
                String str = iconName[index].substring(11,iconName[index].length());
//                sender(str.getBytes("UTF-8"), Server.TEXT,index, request); 
                sender(temp,request,Server.ICON,str,index );
            }
            else if(request==Server.REQUEST_ERROR_IMG){   
                int index = dataInputStream.readInt();                   
                InputStream is = null;                      
                is = InputStream.class.getResourceAsStream(imgName[index]);   
                byte[] temp = new byte[is.available()];  
                is.read(temp);                                    
                String str = imgName[index].substring(7,imgName[index].length());
//                sender(str.getBytes("UTF-8"), Server.TEXT,index, request); 
                sender(temp, request, Server.IMAGE,str,index);
            }
            */
            
        }
    }
    public void sendMail()
    {
        System.out.println("to:"+toAddress);
        System.out.println("subj:"+subj);
         System.out.println("Content:"+content);
         SMTPClient sender=new SMTPClient(toAddress,subj,content);
         sender.send();
    }
    
    public  byte[] intToByteArray(int value) {
        return new byte[] {
                (byte)(value >>> 24),
                (byte)(value >>> 16),
                (byte)(value >>> 8),
                (byte)value};
    }
    
     
    public  int byteArrayToInt(byte [] b) {
        return (b[0] << 24)
                + ((b[1] & 0xFF) << 16)
                + ((b[2] & 0xFF) << 8)
                + (b[3] & 0xFF);
    }
  
    
    private void userSender(String username,int request){
        byte[] intToByte = intToByteArray(request);
        byte[] b = new byte[5];
        System.arraycopy(intToByte, 0, b, 0, 4);
        if(this.username.matches(username)){
            b[4] = 1;
        }
        queue.addData(b);
    }

   
   
    private void sender(byte[] temp,int request,byte kind) throws IOException{
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        byte[] btemp;
        int start = 0;
        int len = 0;
        int segment = 0;
        int dataLen = temp.length;
        int maxLen = 300;
        //Start send image to client
        int j = dataLen/maxLen;
        while(start < dataLen){
            buf.reset();   
            byte[] req = intToByteArray(request);
            buf.write(req);
            buf.write(kind);
            if(start + maxLen >= dataLen){
                //Add segment
                byte[] seg = intToByteArray(-1);
                buf.write(seg);
                // add length
                seg = intToByteArray(dataLen-start);
                buf.write(seg);
                //Add data
                btemp = new byte[dataLen - start];
                System.arraycopy(temp, start, btemp, 0, dataLen - start);
                buf.write(btemp);
                //buf.write(content.substring(start, dataLen).getBytes("UTF-8"));
                len += dataLen - start;
            }
            else{
                //Add segment            
                byte[] seg = intToByteArray(segment);
                buf.write(seg);
                //Add data
                seg = intToByteArray(maxLen);
                buf.write(seg);
                btemp = new byte[maxLen];
                System.arraycopy(temp, start, btemp, 0, maxLen);
                buf.write(btemp);
                //buf.write(content.substring(start, start + maxLen).getBytes("UTF-8"));
                len += maxLen;
            }
            start = len;
            queue.addData(buf.toByteArray());
            segment++;
        }            
    }
    
    
    
  
    private void sender(byte[] temp,int request,byte kind,String name,int index) throws IOException{
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        byte[] btemp;
        int start = 0;
        int len = 0;
        int segment = 0;
        int dataLen = temp.length;
        int maxLen = 300;
        //Start send image to client
        int j = dataLen/maxLen;
        while(start < dataLen){
            buf.reset();   
            byte[] req = intToByteArray(request);
            buf.write(req);
            buf.write(kind);                 
            buf.write((byte)name.getBytes("UTF-8").length);
            buf.write(name.getBytes("UTF-8"));

            System.out.println("length "+name.getBytes("UTF-8").length);
            System.out.println("send name "+name);
            byte[] ind = intToByteArray(index);
            buf.write(ind);
            if(start + maxLen >= dataLen){
                //Add segment
                byte[] seg = intToByteArray(-1);
                buf.write(seg);
                // add length
                seg = intToByteArray(dataLen-start);
                buf.write(seg);
                //Add data
                btemp = new byte[dataLen - start];
                System.arraycopy(temp, start, btemp, 0, dataLen - start);
                buf.write(btemp);
                //buf.write(content.substring(start, dataLen).getBytes("UTF-8"));
                len += dataLen - start;
            }
            else{
                //Add segment            
                byte[] seg = intToByteArray(segment);
                buf.write(seg);
                //Add data
                seg = intToByteArray(maxLen);
                buf.write(seg);
                btemp = new byte[maxLen];
                System.arraycopy(temp, start, btemp, 0, maxLen);
                buf.write(btemp);
                //buf.write(content.substring(start, start + maxLen).getBytes("UTF-8"));
                len += maxLen;
            }
            start = len;
            queue.addData(buf.toByteArray());
            segment++;
        }            
    }
}
